/**
 * 
 */
package br.edu.catolica.sadbc.action;

import java.util.ArrayList;
import java.util.List;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.datamodel.DataModel;

import br.edu.catolica.sadbc.core.action.AbstractAction;
import br.edu.catolica.sadbc.core.exception.BusinessObjectException;
import br.edu.catolica.sadbc.core.exception.ValidateBusinessRulesException;
import br.edu.catolica.sadbc.entity.Usuario;
import br.edu.catolica.sadbc.entity.enums.TipoUsuario;
import br.edu.catolica.sadbc.entity.filter.UsuarioSearchFilter;
import br.edu.catolica.sadbc.manager.UsuarioManager;

/**
 * @author robert.resende
 *
 */
@Name(value = "usuarioAction")
public class UsuarioAction extends AbstractAction<Usuario> {
	
	@In(required = false)
	@Out(required = false)
	private Usuario usuario;
	
	@In(required = false)
	private Usuario usuarioSession;
	
	@In(required = false)
	private UsuarioManager usuarioManager;
	
	@DataModel
	private List<Usuario> usuarios = new ArrayList<Usuario>();

	@In(required = false)
	private UsuarioSearchFilter usuarioSearchFilter; 
	
	private Boolean exibeDataTable = Boolean.FALSE;
	
	public void initAvaliador() {
		this.usuario = null;
		this.usuarioSearchFilter = null;
		this.usuarios = new ArrayList<Usuario>();
		this.exibeDataTable = Boolean.FALSE;
	}
	
	public void initAlterarSenha() {
		this.usuario = this.usuarioManager.buscarUsuarioById(this.usuarioSession.getId());
	}
	
	public String salvarAvaliador() {
		try {
			String retorno = this.usuarioManager.salvarAvaliador(this.usuario);
			addMessageInfo("Operação realizada com sucesso!");
			return retorno;
		} catch (ValidateBusinessRulesException vbe) {
			vbe.printStackTrace();
			addMessageErro(vbe.getLocalizedMessage());
			return RESULT_FAIL;
		} catch (BusinessObjectException boe) {
			boe.printStackTrace();
			addMessageErro(boe.getLocalizedMessage());
			return RESULT_FAIL;
		}
	}
	
	public String atualizarAvaliador() {
		try {
			String retorno = this.usuarioManager.atualizarAvaliador(this.usuario);
			addMessageInfo("Operação realizada com sucesso!");
			return retorno;
		} catch (ValidateBusinessRulesException vbe) {
			vbe.printStackTrace();
			addMessageErro(vbe.getLocalizedMessage());
			return RESULT_FAIL;
		} catch (BusinessObjectException boe) {
			boe.printStackTrace();
			addMessageErro(boe.getLocalizedMessage());
			return RESULT_FAIL;
		}
	}
	
	public List<Usuario> pesquisarAvaliador() {
		if (validarCamposPesquisa(this.usuarioSearchFilter)) {
			this.usuarioSearchFilter.setTipoUsuario(TipoUsuario.AVALIADOR.getValue());
			this.usuarios = this.usuarioManager.pesquisarAvaliador(this.usuarioSearchFilter);
			if (!this.usuarios.isEmpty()) {
				this.exibeDataTable = Boolean.TRUE;
			} else {
				this.usuarios.clear();
				addMessageInfo("Nenhum resultado encontrado.");
			}
		}
		return this.usuarios;
	}
	
	public String atualizarSenha() {
		try {
			String retorno = this.usuarioManager.update(this.usuario);
			addMessageInfo("Operação realizada com sucesso!");
			return retorno;
		} catch (ValidateBusinessRulesException vbe) {
			vbe.printStackTrace();
			addMessageErro(vbe.getLocalizedMessage());
			return RESULT_FAIL;
		} catch (BusinessObjectException boe) {
			boe.printStackTrace();
			addMessageErro(boe.getLocalizedMessage());
			return RESULT_FAIL;
		}
	}
	
	public String editarAvaliador(Usuario usuario) {
		this.usuario = usuario;
		return "RESULT_EDIT_AVALIADOR";
	}
	
	@SuppressWarnings("unused")
	public String excluirAvaliador(Usuario usuario) {
		try {
			String retorno = this.usuarioManager.excluirAvaliador(usuario);
			return "RESULT_EXCLUDE_AVALIADOR";
		} catch (BusinessObjectException boe) {
			boe.printStackTrace();
			addMessageErro(boe.getLocalizedMessage());
			return RESULT_FAIL;
		}
	}
	
	@SuppressWarnings("unused")
	public String incluirAvaliador(Usuario usuario) {
		try {
			String retorno = this.usuarioManager.incluirAvaliador(usuario);
			return "RESULT_INCLUDE_AVALIADOR";
		} catch (BusinessObjectException boe) {
			boe.printStackTrace();
			addMessageErro(boe.getLocalizedMessage());
			return RESULT_FAIL;
		}
	}
	
	private boolean validarCamposPesquisa(UsuarioSearchFilter usuarioSearchFilter) {
		return Boolean.TRUE;
	}

	public Boolean getExibeDataTable() {
		return exibeDataTable;
	}

	public void setExibeDataTable(Boolean exibeDataTable) {
		this.exibeDataTable = exibeDataTable;
	}

}
